package tech.jdbc.entity;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * Create with Intellij IDEA
 *
 * @Author Q
 * @date 2021/11/26/14:44
 */
public class PointFieldDemo {
    public static void main(String[] args) {
        // 获取类的class实例 - 反射技术的基础类
        try {
            //获取类Point的Class实例
            Class<?> c = Class.forName("tech.jdbc.entity.Point");
            //反射获取字段
            Field[] fields = c.getDeclaredFields();
            //遍历
            for (Field field : fields) {
                //System.out.println(field);

                //打印修饰符
                System.out.print(Modifier.toString(field.getModifiers())+" ");

                //打印数据类型的简称
                System.out.print(field.getType().getSimpleName()+" ");

                //打印字段的名称
                System.out.println(field.getName());
            }

            System.out.println("=====反射设置字段值=====");

            //对封装
            //传统的方式 - 如果id设置成private,外界是不能够直接对id进行赋值和访问这个动作的
//            Point point = new Point();
//            point.id = 100;
//            System.out.println(point);

            //反射设置私有属性的值
            //根据属性名来获取这个属性对应的Field对象
            Field x = c.getDeclaredField("id");

            //反射操作的是私有的成员[属性或者方法]
            x.setAccessible(true);
            //Point point = new Point();

            //通过反射的方式来构建对象 - 反射的api来调用构造方法
            Point point = (Point) c.newInstance();
            x.set(point,100);


            //反射设置name属性的值

            //根据name属性的值得到Field对象
            Field name = c.getDeclaredField("name");
            name.setAccessible(true);

            name.set(point,"admin");
            System.out.println(point);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}
